/**
 * @file drv_led_v2.h
 * @brief RGB三通道LED驱动 \n 
 * 新增支持 256 和 4096 级灰度调节
 * @author wangh (wanghuan3037@fiberhome.com)
 * @version 1.0
 * @date 2021-01-26
 * @copyright Copyright (c) 2021  烽火通信
 */
#ifndef __DRV_LED_V2_H
#define __DRV_LED_V2_H 
#include "project_config.h"
#if DRV_LED_EN
#include <stdint.h>
#include <stdbool.h>
#include "boards.h"

#if (LED_BRIGHTNESS_LEVEL == LED_BRIGHTNESS_256)
/** @brief RGB 256颜色 */
typedef struct RGB_s
{
    uint8_t r;  ///< 红色
    uint8_t g;  ///< 绿色
    uint8_t b;  ///< 蓝色
} RGB_t;
#elif (LED_BRIGHTNESS_LEVEL == LED_BRIGHTNESS_4096)
/** @brief RGB 4096级颜色 */
typedef struct RGB_s
{
    uint16_t r;  ///< 红色
    uint16_t g;  ///< 绿色
    uint16_t b;  ///< 蓝色
} RGB_t;
#endif

#if LED_DRV_USE_HSV
typedef struct HSV_s
{
    uint16_t h; ///< 色调
    uint8_t s;  ///< 饱和度
    uint8_t v;  ///< 明度
} HSV_t;
#endif

/** @brief LED芯片型号 */
typedef enum 
{
    WS2811,
    WS2812,
    TM1914,
    UCS5603,
} LedChip_t;

/** @brief 点灯模式 */
typedef enum 
{
    LED_KEEP_MODE,      ///< 常亮保持模式
    LED_BLINK_MODE,     ///< 闪烁模式
    LED_WATER_MODE,     ///< 流水模式
    LED_GRADUAL_MODE,   ///< 渐变模式
} LightMode_t;

/**
 * @brief LED驱动对象结构体
 */
typedef struct LedDrv_s
{
    uint8_t DA;
    LedChip_t CHIP;
    bool IsInitialized; ///< 是否初始化
    uint8_t ws_num;     ///< 级联个数

    RGB_t rgb_loop[LED_LOOP_SIZE];  ///< 颜色循环序列
    uint8_t rgb_loop_num;       ///< 颜色循环序列数量
    LightMode_t lightMode;      ///< 点灯模式

    uint8_t led_gradual_step;   ///< 渐变步数
    uint8_t led_blink_flag;     ///< 闪烁标志

#if (LED_DRV_MODE == LED_DRV_MODE_PWM) || (LED_DRV_MODE == LED_DRV_MODE_APP_PWM)
    uint16_t led_period;        ///< LED 周期
    uint16_t led_pulse_high;    ///< LED 1码 PWM值
    uint16_t led_pulse_low;     ///< LED 0码 PWM值
#endif
} LedDrv_t;

/** @brief light设置信息 */
typedef struct 
{
    LightMode_t mode;
    uint8_t rgb_loop_num;
    RGB_t rgb_loop[LED_LOOP_SIZE];
    uint8_t step;
    uint8_t speed;
#if (LED_BRIGHTNESS_LEVEL == LED_BRIGHTNESS_4096)
    uint8_t current;
#endif

} LedSet_t __attribute((aligned (4)));

/**
 * @brief LED驱动初始化
 * @param[in]  obj      LED驱动对象
 * @param[in]  chip     LED驱动芯片型号
 * @param[in]  da       数据线
 * @param[in]  nws      级联个数
 * @return int8_t 
 * - @b Sucess : BSP_SUCCESS \n
 * - @b Fail
 * - @ref BSP_ERROR_INVALID_PARAM - 入参错误
 * - @ref BSP_ERROR_NO_MEM - 内存错误
 */
int8_t led_init( LedDrv_t *obj, LedChip_t chip, uint8_t da, uint8_t nws );

/**
 * @brief LED设置
 * @param[in]  obj      LED对象
 * @param[in]  rgb_loop RGB调色数组
 * @param[in]  rgb_loop_num RGB调色数组长度
 * @param[in]  mode     点灯模式
 * @param[in]  step     渐变步长
 * @param[in]  speed    变化速率（ms）
 * @return int8_t 0：成功，-1：失败
 */
int8_t led_set( LedDrv_t *obj, RGB_t *rgb_loop, uint8_t rgb_loop_num, LightMode_t mode, uint8_t step, uint16_t speed);

#if (LED_BRIGHTNESS_LEVEL == LED_BRIGHTNESS_4096)
/**
 * @brief LED设置RGB通道电流
 * @param[in]  obj      LED对象
 * @param[in]  cur_r    R通道电流
 * @param[in]  cur_g    G通道电流
 * @param[in]  cur_b    B通道电流
 */
void led_set_cur( LedDrv_t *obj, uint8_t cur_r, uint8_t cur_g, uint8_t cur_b);
#endif

#endif  /* DRV_LED_EN */

#endif	 // __DRV_LED_V2_H 

/*********** (C) COPYRIGHT 2021 FiberHome *****END OF FILE****/
